/*
 * @Author: zhengshundong
 * @Date:   2020-08-26 21:06:33
 * @Last Modified by:   zhengshundong
 * @Last Modified time: 2020-08-26 21:19:55
 */
import config from '../config/config.js'
import Artery from '../utils/Artery.js'

export default {
  // 只调用一次，指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。
  bind (el, binding, vnode) {
    /**
     *
     * @param target
     * @returns {*}
     * @description  如果有父元素，那么就返回父元素，如果没有就直接返回false
     */
    function hasParent (target) {
      if (target.parentNode) {
        return target.parentNode
      } else {
        return false
      }
    }

    /**
     *
     * @param target
     * @param className
     * @returns {boolean}
     * @description  判断目标元素||目标元素的祖先元素是否包含className
     */
    function parentsHasClass (target, className) {
      var _parent = target
      var _flag = false
      if (Artery.hasClass(target, config.prefix + '-' + className)) {
        _flag = true
        return _flag
      } else {
        do {
          _parent = hasParent(_parent)
          if (Artery.hasClass(_parent, config.prefix + '-' + className)) {
            _flag = true
            // 打断循环
            break
          }
        } while (_parent)
        return _flag
      }
    }

    /**
     *
     * @param e
     * @returns {boolean}
     * @description  处理方法
     */
    function documentHandler (e) {
      /*
       * IE有许多好用的方法，后来都被其他浏览器抄袭了，比如这个contains方法。
       * 如果A元素包含B元素，则返回true，否则false。
       * 唯一不支持这个方法的是IE的死对头firefox。
       * https://www.cnblogs.com/rubylouvre/archive/2009/10/14/1583523.html
       * 支持compareDocumentPosition()
       * 如果在 firefox中报错了，再来做兼容,以下是兼容方法。 2018-03-28 wuwg
       */
      /**
       * if(!!window.find){
       * HTMLElement.prototype.contains = function(B){
       * return this.compareDocumentPosition(B) - 19 > 0
       * }
       * }
       * //PPK给出如下解决方法。
       * if (window.Node && Node.prototype && !Node.prototype.contains){
       * Node.prototype.contains = function (arg) {
       * return !!(this.compareDocumentPosition(arg) & 16)
       * }
       * }
       */
      //  如果包含直接返回
      if (el.contains(e.target)) {
        return false
      }

      //  如果点击的是 select-dropdown
      if (parentsHasClass(e.target, 'select-dropdown')) {
        //   debugger
        return false
      }

      if (parentsHasClass(e.target, 'poptip-popper')) {
        return false
      }

      // 执行方法

      if (binding.expression) {
        binding.value(e)
      }
    }
    const debounceDocumentHandler = Artery.debounce(documentHandler, this, Artery.clickoutsideDelay ? Artery.clickoutsideDelay : 300)
    //
    el.__vueClickOutside__ = documentHandler
    el.__vueClickOutside_debounce__ = debounceDocumentHandler
    /*
     * if(vnode && vnode.parent && vnode.parent.componentInstance) {
     * let parent = vnode.parent.componentInstance;
     * let scroll = Artery.findComponentUpward(parent, "aty-scroll");
     * if(scroll) {
     * document.addEventListener('wheel', documentHandler);
     * }
     *}
     */
    document.addEventListener('wheel', debounceDocumentHandler)
    document.addEventListener('mousedown', documentHandler)
  },
  update () {

  },
  // 只调用一次，指令与元素解绑时调用。
  unbind (el, binding) {
    document.removeEventListener('mousedown', el.__vueClickOutside__)
    delete el.__vueClickOutside__
    document.removeEventListener('wheel', el.__vueClickOutside_debounce__)
    delete el.__vueClickOutside_debounce__
  }
}
